package com.bjsxt.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bjsxt.domain.SysRole;
import com.bjsxt.mapper.SysRoleMapper;
import com.bjsxt.service.SysRolePrivilegeService;
import com.bjsxt.service.SysRoleService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {

    /**
     * 用户权限业务层对象
     */
    @Autowired
    private SysRolePrivilegeService sysRolePrivilegeService;

    /**
     * 角色 mapper 接口
     */
    @Autowired
    private SysRoleMapper sysRoleMapper;

    /**
     * 根据用户 id 判断当前用户是否是超级管理员
     *
     * @param userId 用户 id
     * @return true 是超级管理员 false 不是超级管理员
     */
    @Override
    public boolean isSuperAdmin(Long userId) {
        // 当用户的角色 code 为: ROLE_ADMIN 时, 该用户为超级管理员
        String roleCode = sysRoleMapper.getUserRoleCode(userId);
        // 如果返回的 roleCode 不是空并且等于 ROLE_ADMIN 那就返回 true
        if (StringUtils.isNotBlank(roleCode) && roleCode.equals("ROLE_ADMIN")) return true;
        // 返回不是
        return false;
    }

    /**
     * 使用角色的名称模糊查询分页角色
     *
     * @param page 分页对象
     * @param name 角色名称
     * @return 分页数据
     */
    @Override
    public Page<SysRole> PageByName(Page<SysRole> page, String name) {
        // 根据名称查询模糊查询分页数据
        return page(page, new LambdaQueryWrapper<SysRole>().like(StringUtils.isNotBlank(name), SysRole::getName, name));
    }

    /**
     * 级联删除角色，将角色数据以及角色下的菜单权限全部删除掉。
     *
     * @param ids 角色 id 数组
     * @return true 删除成功 false 删除失败
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean removeRoleByIds(Long[] ids) {
        // 先把需要删除的 roleId 进行遍历，首先删除角色数据
        for (Long id : ids) {
            // 调用业务层方法进行 id 角色数据的删除
            sysRoleMapper.deleteById(id);
            // 调用业务层方法进行用户权限数据的移除
            sysRolePrivilegeService.removeByRoleId(id);
            // 返回删除成功的响应值
            return true;
        }
        // 返回删除失败的响应值
        return false;
    }
}
